knitr::opts_chunk$set(message = FALSE)
knitr::opts_chunk$set(warning = FALSE)

Invent some TPCs (purple is f(T), orange is g(T))

make up temperature time series

set.seed(101)
time <- seq_along(1:100)
temps <- data.frame(temperature = runif(100, min = 5, max = 33), time = time)

plot temps over time

temp_plot <- temps %>% 
    ggplot(aes(x = time, y = temperature)) + geom_line(size = 1) +
    ylab("Temperature (°C)") + xlab("Time (days)")

temp_plot

get trait values

f_time_series <- data.frame(time = time, ftrait = sapply(X = temps$temperature, FUN = f_curve), temperature = temps$temperature)
g_time_series <- data.frame(time = time, gtrait = sapply(X = temps$temperature, FUN = g_curve), temperature = temps$temperature)

plot traits over time

Calculate rolling covariances over the time series with different time slice durations (2, 5, 10, 20 days)

all_cov <- left_join(covariances2, covariances5) %>% 
    left_join(covariances10) %>% 
    left_join(covariances20) %>% 
    gather(key = slice, value = covariance, 2:5) %>% 
    mutate(slice = str_replace_all(slice, "[a-z, .]", "")) %>% 
    rename(time_slice = slice) %>% 
    mutate(time_slice = as.numeric(time_slice))
Joining, by = "time_point"
Joining, by = "time_point"
Joining, by = "time_point"

Plot all together

tpcs

Now, focusing on the 2 day time slice only, check that <R0(T)> = <f(T)g(T)> = <f(T)><g(T)> + Cov[f(T), g(T)]

Looks like this isn’t working as I expected! i.e. the blue and green lines below should be lining up…Hmmm….

Now, focusing on the 10 day time slice only, check that <R0(T)> = <f(T)g(T)> = <f(T)><g(T)> + Cov[f(T), g(T)]

Looks like this isn’t working as I expected! i.e. the blue and green lines below should be lining up…Hmmm….

Ok let’s try something simpler.

LS0tCnRpdGxlOiAiQ292YXJpYW5jZSBtZXNzaW5nIGFyb3VuZCIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6IGRlZmF1bHQKICBodG1sX25vdGVib29rOiBkZWZhdWx0CiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0Ci0tLQoKYGBge3J9CmtuaXRyOjpvcHRzX2NodW5rJHNldChtZXNzYWdlID0gRkFMU0UpCmtuaXRyOjpvcHRzX2NodW5rJHNldCh3YXJuaW5nID0gRkFMU0UpCmBgYAoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGNvd3Bsb3QpCnRoZW1lX3NldCh0aGVtZV9jb3dwbG90KCkpCmxpYnJhcnkocm9sbCkKYGBgCgoKCiMjIyMgSW52ZW50IHNvbWUgVFBDcyAocHVycGxlIGlzIGYoVCksIG9yYW5nZSBpcyBnKFQpKQpgYGB7cn0KZl9jdXJ2ZSA8LSBmdW5jdGlvbih4KSAwLjA2KmV4cCgwLjA5KngpKigxLSgoeC0xNSkvKDM0LzIpKV4yKQpnX2N1cnZlIDwtIGZ1bmN0aW9uKHgpIDAuMDEqZXhwKDAuMTUqeCkKcCA8LSBnZ3Bsb3QoZGF0YSA9IGRhdGEuZnJhbWUoeCA9IDApLCBtYXBwaW5nID0gYWVzKHggPSB4KSkgCgp0cGNzIDwtIHAgKyAKCXN0YXRfZnVuY3Rpb24oZnVuID0gZl9jdXJ2ZSwgY29sb3IgPSAicHVycGxlIiwgc2l6ZSA9IDIpICsKCXN0YXRfZnVuY3Rpb24oZnVuID0gZ19jdXJ2ZSwgY29sb3IgPSAib3JhbmdlIiwgc2l6ZSA9IDIpICsKCXhsaW0oMCwgMzUpICsgeWxpbSgtMC4xLCAwLjUpICsgCgl4bGFiKCJUZW1wZXJhdHVyZSAowrBDKSIpICsgeWxhYigiVHJhaXQiKSArIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApCgp0cGNzCgpgYGAKCgoKCgojIyMjIG1ha2UgdXAgdGVtcGVyYXR1cmUgdGltZSBzZXJpZXMKYGBge3J9CnNldC5zZWVkKDEwMSkKdGltZSA8LSBzZXFfYWxvbmcoMToxMDApCnRlbXBzIDwtIGRhdGEuZnJhbWUodGVtcGVyYXR1cmUgPSBydW5pZigxMDAsIG1pbiA9IDUsIG1heCA9IDMzKSwgdGltZSA9IHRpbWUpCgpgYGAKCgoKIyMjIyBwbG90IHRlbXBzIG92ZXIgdGltZQoKYGBge3J9CnRlbXBfcGxvdCA8LSB0ZW1wcyAlPiUgCglnZ3Bsb3QoYWVzKHggPSB0aW1lLCB5ID0gdGVtcGVyYXR1cmUpKSArIGdlb21fbGluZShzaXplID0gMSkgKwoJeWxhYigiVGVtcGVyYXR1cmUgKMKwQykiKSArIHhsYWIoIlRpbWUgKGRheXMpIikKCnRlbXBfcGxvdApgYGAKCgojIyMjIGdldCB0cmFpdCB2YWx1ZXMKCmBgYHtyfQpmX3RpbWVfc2VyaWVzIDwtIGRhdGEuZnJhbWUodGltZSA9IHRpbWUsIGZ0cmFpdCA9IHNhcHBseShYID0gdGVtcHMkdGVtcGVyYXR1cmUsIEZVTiA9IGZfY3VydmUpLCB0ZW1wZXJhdHVyZSA9IHRlbXBzJHRlbXBlcmF0dXJlKQpnX3RpbWVfc2VyaWVzIDwtIGRhdGEuZnJhbWUodGltZSA9IHRpbWUsIGd0cmFpdCA9IHNhcHBseShYID0gdGVtcHMkdGVtcGVyYXR1cmUsIEZVTiA9IGdfY3VydmUpLCB0ZW1wZXJhdHVyZSA9IHRlbXBzJHRlbXBlcmF0dXJlKQpgYGAKCiMjIyMgcGxvdCB0cmFpdHMgb3ZlciB0aW1lCmBgYHtyfQpib3RoIDwtIGxlZnRfam9pbihmX3RpbWVfc2VyaWVzLCBnX3RpbWVfc2VyaWVzKSAlPiUgCgltdXRhdGUoUl8wID0gZnRyYWl0Kmd0cmFpdCkKCgp0cmFpdF9wbG90IDwtIGJvdGggJT4lIAoJZ2F0aGVyKGtleSA9IHRyYWl0X3R5cGUsIHZhbHVlID0gdHJhaXRfdmFsdWUsIGZ0cmFpdCwgZ3RyYWl0KSAlPiUgCgltdXRhdGUodHJhaXRfdHlwZSA9IGlmZWxzZSh0cmFpdF90eXBlID09ICJmdHJhaXQiLCAiZihUKSIsICJnKFQpIikpICU+JSAKCWdncGxvdChhZXMoeCA9IHRpbWUsIHkgPSB0cmFpdF92YWx1ZSwgY29sb3IgPSB0cmFpdF90eXBlKSkgKyBnZW9tX2xpbmUoc2l6ZSA9IDEpICsKCXNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJwdXJwbGUiLCAib3JhbmdlIikpICt5bGFiKCJUcmFpdCB2YWx1ZSIpICsgeGxhYigiVGltZSAoZGF5cykiKSArCgl0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIikKCnRyYWl0X3Bsb3QKYGBgCgoKCgoKIyMjIyBDYWxjdWxhdGUgcm9sbGluZyBjb3ZhcmlhbmNlcyBvdmVyIHRoZSB0aW1lIHNlcmllcyB3aXRoIGRpZmZlcmVudCB0aW1lIHNsaWNlIGR1cmF0aW9ucyAoMiwgNSwgMTAsIDIwIGRheXMpCgoKYGBge3J9CnRyYWl0cyA8LSBib3RoICU+JSAKCXNlbGVjdChmdHJhaXQsIGd0cmFpdCkgJT4lIAoJYXMubWF0cml4KCkKcmVzdWx0czIgPC0gcm9sbF9jb3YodHJhaXRzLCB3aWR0aCA9IDIsIGNlbnRlciA9IEZBTFNFLCBzY2FsZSA9IEZBTFNFKQpjb3ZhcmlhbmNlczIgPC0gYXMuZGF0YS5mcmFtZShyZXN1bHRzMikgJT4lIAoJc2VsZWN0KGNvbnRhaW5zKCJmIikpICU+JSAKCXJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAiY292YXJpYW5jZSIpICU+JSAKCWZpbHRlcihjb3ZhcmlhbmNlID09ICJndHJhaXQiKSAlPiUgCglnYXRoZXIoa2V5ID0gdGltZV9wb2ludCwgdmFsdWUgPSBjb3ZhcmlhbmNlKSAlPiUgCgltdXRhdGUodGltZV9wb2ludCA9IHN0cl9yZXBsYWNlX2FsbCh0aW1lX3BvaW50LCAiW2EteiwgLl0iLCAiIikpICU+JSAKCW11dGF0ZSh0aW1lX3BvaW50ID0gYXMubnVtZXJpYyh0aW1lX3BvaW50KSkgJT4lIAoJcmVuYW1lKGNvdmFyaWFuY2UyID0gY292YXJpYW5jZSkKCnJlc3VsdHM1IDwtIHJvbGxfY292KHRyYWl0cywgd2lkdGggPSA1LCBjZW50ZXIgPSBGQUxTRSwgc2NhbGUgPSBGQUxTRSkKY292YXJpYW5jZXM1IDwtIGFzLmRhdGEuZnJhbWUocmVzdWx0czUpICU+JSAKCXNlbGVjdChjb250YWlucygiZiIpKSAlPiUgCglyb3duYW1lc190b19jb2x1bW4odmFyID0gImNvdmFyaWFuY2UiKSAlPiUgCglmaWx0ZXIoY292YXJpYW5jZSA9PSAiZ3RyYWl0IikgJT4lIAoJZ2F0aGVyKGtleSA9IHRpbWVfcG9pbnQsIHZhbHVlID0gY292YXJpYW5jZSkgJT4lIAoJbXV0YXRlKHRpbWVfcG9pbnQgPSBzdHJfcmVwbGFjZV9hbGwodGltZV9wb2ludCwgIlthLXosIC5dIiwgIiIpKSAlPiUgCgltdXRhdGUodGltZV9wb2ludCA9IGFzLm51bWVyaWModGltZV9wb2ludCkpICU+JSAKCXJlbmFtZShjb3ZhcmlhbmNlNSA9IGNvdmFyaWFuY2UpCgpyZXN1bHRzMTAgPC0gcm9sbF9jb3YodHJhaXRzLCB3aWR0aCA9IDEwLCBjZW50ZXIgPSBGQUxTRSwgc2NhbGUgPSBGQUxTRSkKY292YXJpYW5jZXMxMCA8LSBhcy5kYXRhLmZyYW1lKHJlc3VsdHMxMCkgJT4lIAoJc2VsZWN0KGNvbnRhaW5zKCJmIikpICU+JSAKCXJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAiY292YXJpYW5jZSIpICU+JSAKCWZpbHRlcihjb3ZhcmlhbmNlID09ICJndHJhaXQiKSAlPiUgCglnYXRoZXIoa2V5ID0gdGltZV9wb2ludCwgdmFsdWUgPSBjb3ZhcmlhbmNlKSAlPiUgCgltdXRhdGUodGltZV9wb2ludCA9IHN0cl9yZXBsYWNlX2FsbCh0aW1lX3BvaW50LCAiW2EteiwgLl0iLCAiIikpICU+JSAKCW11dGF0ZSh0aW1lX3BvaW50ID0gYXMubnVtZXJpYyh0aW1lX3BvaW50KSkgJT4lIAoJcmVuYW1lKGNvdmFyaWFuY2UxMCA9IGNvdmFyaWFuY2UpCgpyZXN1bHRzMjAgPC0gcm9sbF9jb3YodHJhaXRzLCB3aWR0aCA9IDIwLCBjZW50ZXIgPSBGQUxTRSwgc2NhbGUgPSBGQUxTRSkKY292YXJpYW5jZXMyMCA8LSBhcy5kYXRhLmZyYW1lKHJlc3VsdHMyMCkgJT4lIAoJc2VsZWN0KGNvbnRhaW5zKCJmIikpICU+JSAKCXJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAiY292YXJpYW5jZSIpICU+JSAKCWZpbHRlcihjb3ZhcmlhbmNlID09ICJndHJhaXQiKSAlPiUgCglnYXRoZXIoa2V5ID0gdGltZV9wb2ludCwgdmFsdWUgPSBjb3ZhcmlhbmNlKSAlPiUgCgltdXRhdGUodGltZV9wb2ludCA9IHN0cl9yZXBsYWNlX2FsbCh0aW1lX3BvaW50LCAiW2EteiwgLl0iLCAiIikpICU+JSAKCW11dGF0ZSh0aW1lX3BvaW50ID0gYXMubnVtZXJpYyh0aW1lX3BvaW50KSkgJT4lIAoJcmVuYW1lKGNvdmFyaWFuY2UyMCA9IGNvdmFyaWFuY2UpCgoKCmFsbF9jb3YgPC0gbGVmdF9qb2luKGNvdmFyaWFuY2VzMiwgY292YXJpYW5jZXM1KSAlPiUgCglsZWZ0X2pvaW4oY292YXJpYW5jZXMxMCkgJT4lIAoJbGVmdF9qb2luKGNvdmFyaWFuY2VzMjApICU+JSAKCWdhdGhlcihrZXkgPSBzbGljZSwgdmFsdWUgPSBjb3ZhcmlhbmNlLCAyOjUpICU+JSAKCW11dGF0ZShzbGljZSA9IHN0cl9yZXBsYWNlX2FsbChzbGljZSwgIlthLXosIC5dIiwgIiIpKSAlPiUgCglyZW5hbWUodGltZV9zbGljZSA9IHNsaWNlKSAlPiUgCgltdXRhdGUodGltZV9zbGljZSA9IGFzLm51bWVyaWModGltZV9zbGljZSkpCgoKY292X3Bsb3QgPC0gYWxsX2NvdiAlPiUgCglnZ3Bsb3QoYWVzKHggPSB0aW1lX3BvaW50LCB5ID0gY292YXJpYW5jZSwgY29sb3IgPSBmYWN0b3IodGltZV9zbGljZSksIGdyb3VwID0gdGltZV9zbGljZSkpICsgZ2VvbV9saW5lKHNpemUgPSAxKSArCgkgc2NhbGVfY29sb3JfdmlyaWRpc19kKG5hbWUgPSAiRHVyYXRpb24gb2YgdGltZSBzbGljZSIpICsgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKyB5bGFiKCJDb3ZbZihUKSwgZyhUKV0iKSArCgl4bGFiKCJUaW1lIChkYXlzKSIpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIpCmBgYAoKIyMjIyBQbG90IGFsbCB0b2dldGhlcgoKYGBge3J9CnRwY3MKYGBgCgpgYGB7ciwgZmlnLmhlaWdodD0xMiwgZmlnX3dpZHRoID0gOCB9CmFsbF9wbG90czEgPC0gcGxvdF9ncmlkKHRlbXBfcGxvdCwgdHJhaXRfcGxvdCwgY292X3Bsb3QsIG5yb3cgPSAzLCBuY29sID0gMSkKYWxsX3Bsb3RzMQpgYGAKCiMjIyBOb3csIGZvY3VzaW5nIG9uIHRoZSAyIGRheSB0aW1lIHNsaWNlIG9ubHksIGNoZWNrIHRoYXQgYDxSMChUKT5gID0gIGA8ZihUKWcoVCk+YCA9ICBgPGYoVCk+PGcoVCk+YCArIGBDb3ZbZihUKSwgZyhUKV1gCkxvb2tzIGxpa2UgdGhpcyBpc24ndCB3b3JraW5nIGFzIEkgZXhwZWN0ZWQhIGkuZS4gdGhlIGJsdWUgYW5kIGdyZWVuIGxpbmVzIGJlbG93IHNob3VsZCBiZSBsaW5pbmcgdXAuLi5IbW1tLi4uLgoKYGBge3IsIGZpZ193aWR0aCA9IDE0fQoKIyMjIGdldCB0aW1lIHJvbGxpbmcgYXZlcmFnZSBmb3IgUl8wLCBpLmUuIDxSMChUKT4gPSAgPGYoVClnKFQpPgpSXzAgPSBib3RoICU+JSAKCW11dGF0ZShSXzAgPSBmdHJhaXQqZ3RyYWl0KSAlPiUgCglzZWxlY3QoUl8wKSAlPiUgCglhcy5tYXRyaXgoKQpyZXN1bHRzMl9SXzAgPC0gcm9sbF9tZWFuKFJfMCwgd2lkdGggPSAyKQptZWFuMiA8LSBkYXRhLmZyYW1lKG1lYW5fUjAgPSByZXN1bHRzMl9SXzAsIGNvbXBsZXRlX29icyA9IFRSVUUpICU+JSAKCXJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAidGltZSIpCgoKIyMjIGdldCB0aW1lIHJvbGxpbmcgYXZlcmFnZSBmb3IgZihUKSwgPGYoVCk+CmZfYXZnIDwtIGJvdGggJT4lIAoJc2VsZWN0KGZ0cmFpdCkgJT4lIAoJYXMubWF0cml4KCkKcmVzdWx0czJfZm1lYW4gPC0gcm9sbF9tZWFuKGZfYXZnLCB3aWR0aCA9IDIpCm1lYW5mMiA8LSBkYXRhLmZyYW1lKG1lYW5fZiA9IHJlc3VsdHMyX2ZtZWFuLCBjb21wbGV0ZV9vYnMgPSBUUlVFKSAlPiUgCglyb3duYW1lc190b19jb2x1bW4odmFyID0gInRpbWUiKQoKIyMjIGdldCB0aW1lIHJvbGxpbmcgYXZlcmFnZSBmb3IgZyhUKSwgPGcoVCk+CmdfYXZnIDwtIGJvdGggJT4lIAoJc2VsZWN0KGd0cmFpdCkgJT4lIAoJYXMubWF0cml4KCkKcmVzdWx0czJfZ21lYW4gPC0gcm9sbF9tZWFuKGdfYXZnLCB3aWR0aCA9IDIsIGNvbXBsZXRlX29icyA9IFRSVUUpCm1lYW5nMiA8LSBkYXRhLmZyYW1lKG1lYW5fZyA9IHJlc3VsdHMyX2dtZWFuKSAlPiUgCglyb3duYW1lc190b19jb2x1bW4odmFyID0gInRpbWUiKQoKCiMjIyBwdXQgYWxsIHRoZSBhdmVyYWdlcyB0b2dldGhlcgphbGxfYXZncyA8LSBsZWZ0X2pvaW4obWVhbjIsIG1lYW5mMikgJT4lIAoJbGVmdF9qb2luKG1lYW5nMikgJT4lIAoJbXV0YXRlKHRpbWUgPSBhcy5udW1lcmljKHRpbWUpKSAlPiUgCglsZWZ0X2pvaW4oY292YXJpYW5jZXMyLCBieSA9IGMoInRpbWUiID0gInRpbWVfcG9pbnQiKSkgJT4lIAoJbXV0YXRlKGA8ZihUKT48ZyhUKT4gKyBDb3ZbZihUKSwgZyhUKV1gID0gKGZ0cmFpdCpndHJhaXQpICsgY292YXJpYW5jZTIpICU+JSAKCXNlbGVjdCgtY29tcGxldGVfb2JzKSAlPiUgCgltdXRhdGUoYDxmKFQpPjxnKFQpPmAgPSBmdHJhaXQqZ3RyYWl0KSAlPiUgCglnYXRoZXIoa2V5ID0gcGFyYW1ldGVyLCB2YWx1ZSA9IHZhbHVlLCAyOjcpCgojIyBwbG90CmFsbF9hdmdzICU+JSAKCWZpbHRlcihwYXJhbWV0ZXIgJWluJSBjKCI8ZihUKT48ZyhUKT4gKyBDb3ZbZihUKSwgZyhUKV0iLCAiUl8wIiwgIjxmKFQpPjxnKFQpPiIsICJjb3ZhcmlhbmNlMiIpKSAlPiUgCgltdXRhdGUocGFyYW1ldGVyID0gc3RyX3JlcGxhY2UocGFyYW1ldGVyLCAiUl8wIiwgIjxmKFQpZyhUKT4iKSkgJT4lIAoJbXV0YXRlKHBhcmFtZXRlciA9IHN0cl9yZXBsYWNlKHBhcmFtZXRlciwgImNvdmFyaWFuY2UyIiwgIkNvdltmKFQpLCBnKFQpXSIpKSAlPiUgCglnZ3Bsb3QoYWVzKHggPSB0aW1lLCB5ID0gdmFsdWUsIGNvbG9yID0gcGFyYW1ldGVyKSkgKyBnZW9tX2xpbmUoKSAKCmBgYAoKIyMjIE5vdywgZm9jdXNpbmcgb24gdGhlIDEwIGRheSB0aW1lIHNsaWNlIG9ubHksIGNoZWNrIHRoYXQgYDxSMChUKT5gID0gIGA8ZihUKWcoVCk+YCA9ICBgPGYoVCk+PGcoVCk+YCArIGBDb3ZbZihUKSwgZyhUKV1gCkxvb2tzIGxpa2UgdGhpcyBpc24ndCB3b3JraW5nIGFzIEkgZXhwZWN0ZWQhIGkuZS4gdGhlIGJsdWUgYW5kIGdyZWVuIGxpbmVzIGJlbG93IHNob3VsZCBiZSBsaW5pbmcgdXAuLi5IbW1tLi4uLgoKYGBge3IsIGZpZ193aWR0aCA9IDE0fQoKIyMjIGdldCB0aW1lIHJvbGxpbmcgYXZlcmFnZSBmb3IgUl8wLCBpLmUuIDxSMChUKT4gPSAgPGYoVClnKFQpPgpSXzAgPSBib3RoICU+JSAKCW11dGF0ZShSXzAgPSBmdHJhaXQqZ3RyYWl0KSAlPiUgCglzZWxlY3QoUl8wKSAlPiUgCglhcy5tYXRyaXgoKQpyZXN1bHRzMTBfUl8wIDwtIHJvbGxfbWVhbihSXzAsIHdpZHRoID0gMTApCm1lYW4xMCA8LSBkYXRhLmZyYW1lKG1lYW5fUjAgPSByZXN1bHRzMTBfUl8wLCBjb21wbGV0ZV9vYnMgPSBUUlVFKSAlPiUgCglyb3duYW1lc190b19jb2x1bW4odmFyID0gInRpbWUiKQoKCiMjIyBnZXQgdGltZSByb2xsaW5nIGF2ZXJhZ2UgZm9yIGYoVCksIDxmKFQpPgpmX2F2ZyA8LSBib3RoICU+JSAKCXNlbGVjdChmdHJhaXQpICU+JSAKCWFzLm1hdHJpeCgpCnJlc3VsdHMxMF9mbWVhbiA8LSByb2xsX21lYW4oZl9hdmcsIHdpZHRoID0gMTApCm1lYW5mMTAgPC0gZGF0YS5mcmFtZShtZWFuX2YgPSByZXN1bHRzMTBfZm1lYW4sIGNvbXBsZXRlX29icyA9IFRSVUUpICU+JSAKCXJvd25hbWVzX3RvX2NvbHVtbih2YXIgPSAidGltZSIpCgojIyMgZ2V0IHRpbWUgcm9sbGluZyBhdmVyYWdlIGZvciBnKFQpLCA8ZyhUKT4KZ19hdmcgPC0gYm90aCAlPiUgCglzZWxlY3QoZ3RyYWl0KSAlPiUgCglhcy5tYXRyaXgoKQpyZXN1bHRzMTBfZ21lYW4gPC0gcm9sbF9tZWFuKGdfYXZnLCB3aWR0aCA9IDEwLCBjb21wbGV0ZV9vYnMgPSBUUlVFKQptZWFuZzEwIDwtIGRhdGEuZnJhbWUobWVhbl9nID0gcmVzdWx0czEwX2dtZWFuKSAlPiUgCglyb3duYW1lc190b19jb2x1bW4odmFyID0gInRpbWUiKQoKCiMjIyBwdXQgYWxsIHRoZSBhdmVyYWdlcyB0b2dldGhlcgphbGxfYXZnc18xMCA8LSBsZWZ0X2pvaW4obWVhbjEwLCBtZWFuZjEwKSAlPiUgCglsZWZ0X2pvaW4obWVhbmcxMCkgJT4lIAoJbXV0YXRlKHRpbWUgPSBhcy5udW1lcmljKHRpbWUpKSAlPiUgCglsZWZ0X2pvaW4oY292YXJpYW5jZXMyLCBieSA9IGMoInRpbWUiID0gInRpbWVfcG9pbnQiKSkgJT4lIAoJbXV0YXRlKGA8ZihUKT48ZyhUKT4gKyBDb3ZbZihUKSwgZyhUKV1gID0gKGZ0cmFpdCpndHJhaXQpICsgY292YXJpYW5jZTIpICU+JSAKCXNlbGVjdCgtY29tcGxldGVfb2JzKSAlPiUgCgltdXRhdGUoYDxmKFQpPjxnKFQpPmAgPSBmdHJhaXQqZ3RyYWl0KSAlPiUgCglnYXRoZXIoa2V5ID0gcGFyYW1ldGVyLCB2YWx1ZSA9IHZhbHVlLCAyOjcpCgojIyBwbG90CmFsbF9hdmdzXzEwICU+JSAKCWZpbHRlcihwYXJhbWV0ZXIgJWluJSBjKCI8ZihUKT48ZyhUKT4gKyBDb3ZbZihUKSwgZyhUKV0iLCAiUl8wIiwgIjxmKFQpPjxnKFQpPiIsICJjb3ZhcmlhbmNlMiIpKSAlPiUgCgltdXRhdGUocGFyYW1ldGVyID0gc3RyX3JlcGxhY2UocGFyYW1ldGVyLCAiUl8wIiwgIjxmKFQpZyhUKT4iKSkgJT4lIAoJbXV0YXRlKHBhcmFtZXRlciA9IHN0cl9yZXBsYWNlKHBhcmFtZXRlciwgImNvdmFyaWFuY2UyIiwgIkNvdltmKFQpLCBnKFQpXSIpKSAlPiUgCglnZ3Bsb3QoYWVzKHggPSB0aW1lLCB5ID0gdmFsdWUsIGNvbG9yID0gcGFyYW1ldGVyKSkgKyBnZW9tX2xpbmUoKSAKCmBgYAoKT2sgbGV0J3MgdHJ5IHNvbWV0aGluZyBzaW1wbGVyLgpgYGB7cn0KCgpncm91cCA8LSAgc29ydChyZXAoc2VxKGZyb20gPSAxLCB0byA9IDIpLCB0aW1lcyA9IDUwKSkKCmFsbCA8LSBib3RoICU+JSAKCW11dGF0ZShncm91cCA9IGdyb3VwKSAlPiUgCgltdXRhdGUoUl8wID0gZnRyYWl0Kmd0cmFpdCkgJT4lIAoJZ3JvdXBfYnkoZ3JvdXApICU+JSAKCW11dGF0ZShgPFJfMD5gID0gbWVhbihSXzApKSAlPiUgCgltdXRhdGUobWVhbl9mdHJhaXQgPSBtZWFuKGZ0cmFpdCkpICU+JSAKCW11dGF0ZShtZWFuX2d0cmFpdCA9IG1lYW4oZ3RyYWl0KSkgJT4lIAoJbXV0YXRlKGNvdl9mZyA9IGNvdihmdHJhaXQsIGd0cmFpdCkpICU+JSAKCW11dGF0ZShgPGYoVCk+PGcoVCk+ICsgQ292W2YoVCksIGcoVCldYCA9IChtZWFuX2Z0cmFpdCAqIG1lYW5fZ3RyYWl0KSArIGNvdl9mZykKCmFsbCAlPiUgCglnZ3Bsb3QoYWVzKHggPSB0aW1lLCB5ID0gYDxmKFQpPjxnKFQpPiArIENvdltmKFQpLCBnKFQpXWApKSArIGdlb21fbGluZSgpICsKCWdlb21fbGluZShhZXMoeCA9IHRpbWUsIHkgPWA8Ul8wPmAgKSwgY29sb3IgPSAiYmx1ZSIpCgoKYGBg